App Extension
概要
色々あるやで
https://developer.apple.com/app-extensions/
App Extension 経由でデータを共有する
App Extension は、メインとなるアプリ (Host App) は別プロセスで動作するし、基本的に App Extension から Host App のデータにはアクセスできないような制限がかけられているため、データ共有ではいくつか気をつける必要がある。
外部の API を利用する
init(suiteName:) を利用して初期化した UserDefaults を利用する
Shared Container を利用する
App Groups を設定する必要がある
Realm 等の DB ファイルを Shared Container におくことで DB の共有なんかは行える (複数プロセスからの読み書きを気にする必要はある)
などなど...
https://dmtopolog.com/ios-app-extensions-data-sharing/
https://gaprot.jp/2014/10/17/app-groups/
Host App と App Extension のやりとり
App Extension は、ユーザが Host App 内で Extension を起動した時、Host App からリクエストされて起動する
Extension はそのリクエストとしてユーザのタスクを手助けし、最終的にリクエストがキャンセルもしくは完了する
beginRequest(with:) でリクエストできるらしい
Host App から App Extension へリクエストが飛ぶ時には、Extension Context が定義される
context には、ユーザが extension 内で作業に用いたい複数の item 群が含まれる
App Extension は、View Controller の extensionContext から Context にアクセスできる
この Context は child view controller にも伝播する
Context 情報を利用して仕事を完了したら、以下のいずれかを実行する
を呼び出して正常終了する
を呼び出して異常終了する
https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionCreation.html#//apple_ref/doc/uid/TP40014214-CH5-SW3
Share Extension
https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/Share.html
共有可能なコンテンツを制限する
https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8
NSExtensionContext
App Extension に対する Host App からの起動リクエストに含まれる Context 情報。Context 情報には、Extension 内でのユーザの作業に利用させたい item 群も保持されていて、inputItems プロパティに含まれている。これは NSExtensionItem の配列になっている。各 NSExtensionItem は、item のタイトルやユーザ情報等の様々な情報を含んでおり、特に attachments プロパティにはメディアデータが格納される。
NSExtensionItem
https://developer.apple.com/documentation/foundation/nsextensionitem
userInfo に、下記のキーに応じた値が入っている。
https://developer.apple.com/documentation/foundation/nsextensionitem/property_keys
NSItemProvider
hasItemConformingToTypeIdentifier(_:) を利用すると、データの種別を判定できる。データ種別は UTI で識別する。データ種別を判定できたら、その種別で loadItem(forTypeIdentifier:options:completionHandler:) を呼び出して、データをロードする。
デバッグ
プロセスをアタッチすればOK。
https://qiita.com/y-okudera/items/1ca4f380854f9e0cb30d